package com.dbh.jdk8.lambda;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * list和array转换操作
 *
 * @author dongbanghui
 * @create 2022/5/18
 */
public class ArrayAndList {

    public static void main(String[] args) {

        // 将list元素存储到数组中
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
        System.out.println(Arrays.toString(arr));

        // 将数组元素存储到list中
        int[] arr2 = {5, 4, 3, 2, 1};
        List<Integer> list2 = IntStream.of(arr2).sorted().boxed().collect(Collectors.toList());
        System.out.println(list2);

        String[] arr3 = {"a", "c", "a", "b", "d", "c"};
//        Map<String, Integer> map = new HashMap<>();
//        for (String s : arr3) {
//            map.put(s, map.getOrDefault(s, 0) +1);
//        }
        // Collectors.toMap(k -> k, k -> 1, Integer::sum)
        // 参数1：表示将arr3中的每一个元素作为Map中的key
        // 参数2：表示每一个key所对应的value，这里每一个元素对应个数都是1
        // 参数3：表示存在相同key，该如何合并，Integer::sum表示将相同key合同时，value进行相加
        Stream.of(arr3).collect(Collectors.toMap(k -> k, k -> 1, Integer::sum))
        .forEach((key, value) -> System.out.println(key + ":" + value));

    }

    public int[] topKFrequent(int[] nums, int k) {
        return Arrays.stream(nums)
                .boxed()
                .collect(Collectors.toMap(e -> e, e -> 1, Integer::sum))
                .entrySet()
                .stream()
                .sorted((m1, m2) -> m2.getValue() - m1.getValue())
                .limit(k)
                .mapToInt((Map.Entry::getKey))
                .toArray();
    }

}
